'use strict';

const {Controller} = require('ee-core');
const Cross = require('ee-core/cross');
const Log = require('ee-core/log');
const HttpClient = require('ee-core/httpclient');
const Services = require('ee-core/services');

/**
 * Cross
 * @class
 */
class CrossController extends Controller {

    constructor(ctx) {
        super(ctx);
    }

    /**
     * View process service information
     */
    info() {
        const pids = Cross.getPids();
        Log.info('cross pids:', pids);

        let num = 1;
        pids.forEach(pid => {
            let entity = Cross.getProc(pid);
            Log.info(`server-${num} name:${entity.name}`);
            Log.info(`server-${num} config:`, entity.config);
            num++;
        })

        return 'hello electron-egg';
    }

    /**
     * Get service url
     */
    async getUrl(args) {
        const {name} = args;
        const serverUrl = Cross.getUrl(name);
        return serverUrl;
    }

    /**
     * kill service
     * By default (modifiable), killing the process will exit the electron application.
     */
    async killServer(args) {
        const {type, name} = args;
        if (type == 'all') {
            Cross.killAll();
        } else {
            Cross.killByName(name);
        }

        return;
    }

    /**
     * create service
     */
    async createServer(args) {
        const {program} = args;
        if (program == 'go') {
            Services.get('cross').createGoServer();
        } else if (program == 'java') {
            Services.get('cross').createJavaServer();
        } else if (program == 'python') {
            Services.get('cross').createPythonServer();
        }

        return;
    }

    /**
     * Access the api for the cross service
     */
    async requestApi(args) {
        const {name, urlPath, params} = args;
        const hc = new HttpClient();
        const serverUrl = Cross.getUrl(name);
        console.log('Server Url:', serverUrl);

        const apiHello = serverUrl + urlPath;
        const options = {
            method: 'GET',
            data: params || {},
            dataType: 'json',
            timeout: 1000,
        };
        const result = await hc.request(apiHello, options);

        return result.data;
    }
}

CrossController.toString = () => '[class CrossController]';
module.exports = CrossController;
